# 什么是C/S架构？
# c是客户端，s是服务器端



# 互联网协议是什么？分别介绍五层协议中每一层的功能？
#    计算机界通用的语言
#物理层：物理连接，可以传递1和0信号
#数据链路层：把1和0组成数据包，有包头信息，包含发送者，接收者，数据格式，存有mac地址
#网络层：ip提供接收者的大概位置（局网）再由广播进行mac地址查找对应电脑
#传输层：确定计算机上的端口（一个程序占一个端口）
#应用层：规定应用程序的数据格式 如：WWW,FTP,Eamil等




# 基于tcp协议通信，为何建立链接需要三次握手，而断开链接却需要四次挥手
#三次握手：防止因网络堵塞导致的失效报文段再次访问服务器端而确定连接，从而形成三次握手防止此现象出现来浪费服务器端资源
#四次握手：tcp是全双工模式，c发报文让s知道没有信息要发了，s发报文让c知道没有信息要发，c再发才知道s发完了菜断开连接




# 为何基于tcp协议的通信比基于udp协议的通信更可靠？
# tcp是可靠传输协议 s发出的信息如果c没收到会报错
# udp是不可靠协议  s发出信息以后就和s没关系了




# ‍流式协议指的是什么协议，数据报协议指的是什么协议？
#      tcp                 udp




# 什么是socket？简述基于tcp协议的套接字通信流程
#socket是tcp/ip协议族通信的中间软件抽象层，它是一组接口。是门面模式，把复杂的tcp/ip协议族通信隐藏在接口后，对于用户就是一组接口
# 服务器端先初始化socket实例化一个类拿到对象，bind绑定ip，listen监听让c可以连接，accept调用接收连接
# 客户端初始化一个socket，connect与服务器建立双向链接与accept对应，c可以发送请求数据，s处理请求并回应，
# 这样就是一个通信循环，关闭套接字，一次交互结束




# 什么是粘包？ socket 中造成粘包的原因是什么？ 哪些情况会发生粘包现象？
# 客户端能recv的字节比实际内容少，导致剩余字节在服务器端的io缓冲区，与下一次一起传输给客户端，形成粘包
# 粘包：两次结果粘在一起了发生的主要原因是socket缓冲区导致的
# 造成粘包的原因：1，接收方不知道消息之间的界限，不知道一次性提取多少字节
#             2.发送方粘包是由于tcp协议导致，发送方往往收集足够多的字节再发送，如果有连续的小字节发送因tcp（优化算法）的原因会导致粘包
# 发生粘包的情况：1.发送端需要等缓冲区满才发送，造成粘包（发送数据时间间隔很短，数据了很小，会合到一起，产生粘包）
#             2.接收方不及时接收数据，造成多个包接收（客户端发送一段数据，服务器端只收了一小部分，服务器端再收是从缓冲区留下的数据，产生粘包）



# 基于socket开发一个聊天程序，实现两端互相发送和接收消息
# kehou_server, kehou_client  的第一题




# 基于tcp socket，开发简单的远程命令执行程序，允许用户执行命令，并返回结果
# kehou_server, kehou_client  的第三题




# 基于tcp协议编写简单FTP程序，实现上传、下载文件功能，并解决粘包问题
# kehou_server, kehou_client  的第二题




# 基于udp协议编写程序，实现功能
# 1.执行指定的命令，让客户端可以查看服务端的时间
# 2.执行指定的命令，让客户端可以与服务的的时间同步
# kehou_server, kehou_client  的第四题




# 作业 (没做好）
# 题目：开发一个支持多用户同时在线的FTP程序          TCP
# 要求：
# 允许单用户登录                                         （有不同用户）
# 每个用户有自己的家目录，且只能访问自己的家目录
# 对用户进行磁盘配额，每个用户的可用空间不同（选做）
# 允许用户在ftp server上随意切换目录
# 允许用户查看当前目录下的文件
# 允许上传和下载文件，并保证文件的一致性
# 文件传输过程中显示进度条
# 附加：支持文件的断点续传（选做）
# 开发的程序需符合PEP8开发规范，及专业的生产软件设计规范，包括目录、代码命名、功能接口等
# import os
# d = {}
# def login():
#     while 1:
#         name = input('账号:').strip()
#         if os.path.isdir(name):
#             paswd = input('密码:').strip()
#             f = open(f'{name}.txt', 'r'):
#             for i in f:
#                 i = i.strip().split()
#                 d[i[0]] = i[1]
#             f.close()
#
#
#
#         else:
#             print('找不到账号，请重新输入')
#             continue
#
#
# login()


